/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.jm.acionista.base.util;

import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 *
 * @author joao
 */
public final class JPAUtil {

    private static EntityManagerFactory FABRICA;

    /**
     * Contrutor privado. *
     */
    private JPAUtil() {
    }

    public synchronized static void carregarFabrica() {
        if (FABRICA == null) {
            try {
                FABRICA = Persistence.createEntityManagerFactory("acionistaPU");
                System.out.println("Fabrica carregada com sucesso.");
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException("Erro na criação da  fabrica - "
                        + e.getMessage());
            }
        }
    }

    public static EntityManager getSession() {
        if (FABRICA == null) {
            throw new RuntimeException(
                    "EntityManagerFactory intranet não foi carregada.");
        } else {
            synchronized (FABRICA) {
                return FABRICA.createEntityManager();
            }
        }
    }

    public static void destruirFabrica() {
        if (FABRICA != null) {
            synchronized (FABRICA) {
                FABRICA.close();
                System.out.println("Fabrica destruida com sucesso.");
            }
        }
    }

    public Connection getConexao() {
        java.sql.Connection conexao = null;
        try {
            Context initContext = new InitialContext();
            Context envContext = (Context) initContext.lookup("java:comp/env/jdbc/");
            javax.sql.DataSource ds = (javax.sql.DataSource) envContext.lookup("jdbc/acionistaPU");
            conexao = (java.sql.Connection) ds.getConnection();
        } catch (NamingException e) {
            e.printStackTrace();
            throw new RuntimeException("Erro na criação da  fabrica - "
                    + e.getMessage());
        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException("Erro na criação da  fabrica - "
                    + e.getMessage());
        }
        return conexao;
    }
}
